﻿using System;
using System.Collections.Generic;
using System.Linq;
using Calendar.Logic.Core;
using Calendar.Logic.ObjectModel.Authorization;

namespace Calendar.Logic.ObjectManager.Authorization
{
    internal static class UserManagerExtended
    {
        public static IQueryable<User> SelectByName(this IQueryable<User> table, string name)
        {
            return table.SelectByApp().Where(u => u.Username == name);
        }

        public static IQueryable<User> SelectByNameToMatch(this IQueryable<User> table, string nameToMatch)
        {
            return table.SelectByApp().Where(u => u.Username.StartsWith(nameToMatch));
        }

        public static IQueryable<User> SelectByEmail(this IQueryable<User> table, string email)
        {
            return table.SelectByApp().Where(u => u.Email == email);
        }

        public static IQueryable<User> SelectByEmailToMatch(this IQueryable<User> table, string emailToMatch)
        {
            return table.SelectByApp().Where(u => u.Email.StartsWith(emailToMatch));
        }

        public static IQueryable<User> SelectInOnline(this IQueryable<User> table, DateTime compareTime)
        {
            return table.SelectByApp().Where(u => u.LastActivityDate > compareTime);
        }

        public static IQueryable<User> SelectByApp(this IQueryable<User> table)
        {
            return table.Where(u => u.ApplicationName == GlobalContext.Instance.ApplicationName);
        }
    }

    public class UserManager : BaseManager<UserManager, User>
    {
        public User SelectByName(string userName)
        {
            return Table.SelectByName(userName.ToLower()).FirstOrDefault();
        }

        public int EditUser(User user)
        {
            if (Table.SelectWithoutId(user.ID).Any(u => u.Email == user.Email))
            {
                throw new ManagerException("Данный email уже используется");
            }

            return Update(user); 
        }

        public List<string> SelectEmailsByIds(int[] userIds)
        {
            return Table.Where(us => userIds.Contains(us.ID)).Select(user => user.Email).ToList();
        } 
        /// <summary>
        /// Метод для проверки существования пользователя с определенным именем
        /// </summary>
        /// <param name="username">Имя пользователя</param>
        /// <returns>True, если пользователь с таким именем существует</returns>
        public bool UserExists(string username)
        {
            return Convert.ToBoolean(Table.SelectByName(username).Count());
        }
    }
}
